package br.com.srv.web.relatorio;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;

import br.com.srv.componentes.relatorio.controleitinerario.service.ControleItinerarioService;
import br.com.srv.componentes.rota.service.RotaService;
import br.com.srv.model.ControleItinerarioTO;
import br.com.srv.model.RotaTO;
import br.com.srv.model.VeiculoTO;
import br.com.srv.security.SecurityPrincipal;
import br.com.srv.util.DateHelper;
import br.com.srv.web.BaseAction;

public class ControleItinerarioAction extends BaseAction {
	
	private final String PAGE_LISTA = "page_lista";
	private final String POPUP_DETALHE = "popup_detalhe";

	public ActionForward preLoad(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		DynaValidatorForm frm = (DynaValidatorForm) form;
		frm.set("dataInicial", DateHelper.getTodayAsString());
		frm.set("dataFinal", DateHelper.getTodayAsString());
		frm.set("horaInicial", "00:00:00");
		frm.set("horaFinal", "23:59:59");
		
		carregarRotas(request);			
		
		return mapping.findForward(PAGE_LISTA);

	}

	private void carregarRotas(HttpServletRequest request) throws Exception {
		SecurityPrincipal principal = getPrincipal(request);		
		RotaTO rotaTO = new RotaTO();
		rotaTO.setClienteId(principal.getClienteId());		
		
		RotaService rotaService = (RotaService) getBeanSpring(RotaService.SERVICE_NAME);
		List<RotaTO> rotas = rotaService.buscarRotasAtivas(rotaTO);
		
		request.setAttribute("rotas", rotas);
	}
	
	public ActionForward consultar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		ControleItinerarioTO controleItinerarioTO = getControleItinerarioTO(form, request);
		
		List<String> erros = validarControleItinerarioTO(controleItinerarioTO);
		//Caso ocorra algum erro de valida��o, retorna para  p�gina e exibe os erros. 
		if (!erros.isEmpty()) {
			saveActionErros(request, erros);
			request.setAttribute("controleItinerario", controleItinerarioTO);
			
			carregarRotas(request);
			request.setAttribute("rotaId", controleItinerarioTO.getRotaId());
			
			return mapping.findForward(PAGE_LISTA);
		}
				
		ControleItinerarioService controleItinerarioService = (ControleItinerarioService)getBeanSpring(
				ControleItinerarioService.SERVICE_NAME);
		Map<String, Object> mapa = controleItinerarioService.consultaControleItinerario(controleItinerarioTO);
		
		request.setAttribute("resultado", mapa.get("lista"));
		request.setAttribute("quantidadeVeiculosTotal", mapa.get("quantidadeVeiculosTotal"));
		request.setAttribute("quantidadeVeiculosComDados", mapa.get("quantidadeVeiculosComDados"));
		request.setAttribute("quantidadeVeiculosSemDados", mapa.get("quantidadeVeiculosSemDados"));
		
		return carregarVeiculos(mapping, form, request, response);

	}
	
	public ActionForward consultarDetalhe(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		String rotaId = request.getParameter("rotaId");
		String veiculoId = request.getParameter("veiculoId");
		String dataInicial = request.getParameter("dataInicial");
		String dataFinal = request.getParameter("dataFinal");					

		ControleItinerarioService controleItinerarioService = (ControleItinerarioService)getBeanSpring(
				ControleItinerarioService.SERVICE_NAME);
		List<ControleItinerarioTO> voltas =
			controleItinerarioService.consultaControleItinerarioDetalhado(
					rotaId, veiculoId, dataInicial, dataFinal);
		
		request.setAttribute("voltas", voltas);
		
		return mapping.findForward(POPUP_DETALHE);
	}	
	
	@SuppressWarnings("unchecked")
	public ActionForward carregarVeiculos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		DynaValidatorForm frm = (DynaValidatorForm) form;	
		@SuppressWarnings("unused")
		Map<String, Object> params = frm.getMap();
		ControleItinerarioTO controleItinerario = getControleItinerarioTO(form, request);

		List<VeiculoTO> veiculos = new ArrayList<VeiculoTO>();		

		
		//se o ID da cerca for null n�o deve retornoar veiculos.
		if (controleItinerario.getRotaId() != null && !controleItinerario.getRotaId().equals("")) {
			RotaService rotaService = (RotaService)getBeanSpring(RotaService.SERVICE_NAME);
			veiculos = rotaService.buscarVeiculosDaRota(new Integer(controleItinerario.getRotaId()));
		} else {
			veiculos = getPrincipal(request).getVeiculosAsTO();
		}
		
		//casrrega as rotas ativas do cliente no request.
		carregarRotas(request);
		request.setAttribute("veiculos", veiculos);
		request.setAttribute("rotaId", controleItinerario.getRotaId());
		
		return mapping.findForward(PAGE_LISTA);		
	}	
	
	/**
	 * Passa os dados do form e constr�i um VeiculoTO.
	 * return ClienteTO.
	 */
	@SuppressWarnings("unchecked")
	private ControleItinerarioTO getControleItinerarioTO(ActionForm form, HttpServletRequest request) {
		DynaValidatorForm frm = (DynaValidatorForm) form;	
		Map<String, Object> params = frm.getMap();
		
		ControleItinerarioTO controleItinerario = new ControleItinerarioTO();
		
		controleItinerario.setRotaId((String)params.get("rotaId"));
		controleItinerario.setVeiculoId((String)params.get("veiculoId"));
		controleItinerario.getPeriodoTO().setDataInicial((String)params.get("dataInicial"));
		controleItinerario.getPeriodoTO().setDataFinal((String)params.get("dataFinal"));
		controleItinerario.getPeriodoTO().setHoraInicial((String)params.get("horaInicial"));
		controleItinerario.getPeriodoTO().setHoraFinal((String)params.get("horaFinal"));
		
		controleItinerario.setClienteId(getPrincipal(request).getClienteIdBD());
		
		try {
			new Integer(controleItinerario.getVeiculoId());
		} catch (Exception e) {
			controleItinerario.setVeiculoId("");
		}
		
		return controleItinerario;
	}
	
	/**
	 * Executa valida��o do controleItinerarioTO antes de fazer a consulta. 
	 * @param controleItinerarioTO ControleItinerarioTO
	 * @return Lista de erros.
	 */
	private List<String> validarControleItinerarioTO(ControleItinerarioTO controleItinerarioTO) {
		
		List<String> erros = new ArrayList<String>();
		
		String dataInicial = controleItinerarioTO.getPeriodoTO().getDataInicial();
		String dataFinal = controleItinerarioTO.getPeriodoTO().getDataFinal();
		String horaInicial = controleItinerarioTO.getPeriodoTO().getHoraInicial();
		String horaFinal = controleItinerarioTO.getPeriodoTO().getHoraFinal();		
		
		if (dataInicial == null || dataInicial.equals("")) {
			erros.add("Data Inicial � um campo obrigat�rio.");
		}
		
		if (dataFinal == null || dataFinal.equals("")) {
			erros.add("Data Final � um campo obrigat�rio.");
		}	
		
		if (horaInicial == null || horaInicial.equals("")) {
			erros.add("Hora Inicial � um campo obrigat�rio.");
		}
		
		if (horaFinal == null || horaFinal.equals("")) {
			erros.add("Hora Final � um campo obrigat�rio.");
		}			
		
		return erros;
	}
	
	private List<RotaTO> carregarRotas(RotaTO rotaTO, HttpServletRequest request) throws Exception {
		rotaTO.setClienteId(getPrincipal(request).getClienteIdBD());
		
		RotaService rotaService = (RotaService) getBeanSpring(RotaService.SERVICE_NAME);
		List<RotaTO> rotas = rotaService.buscarRotasAtivas(rotaTO);
		return rotas;
	}	
}
